package 内部类;

//class OuterClass{
//    public int data1=1;
//    private int data2=2;
//    public static int data3=3;
//
//    public void func() {
//        System.out.println("外部类的方法");
//    }
    /**
     * 静态内部类：在类的内部定义静态类
     * 可以将实例内部类 当做一个静态成员
     */
//    static class InnerClass{
//        public int data1=1000;
//
//        public int data4=4;
//        private int data5=5;
//        public static int data6=6;
//
//        public OuterClass out;
//        public InnerClass(OuterClass o) {
//            this.out=o;
//        }
//
//
//        public void funcInner() {
//            System.out.println("静态内部类的方法");
//            System.out.println(data1);//1000
//            //System.out.println(data2);
//            // data2 属于实例成员变量，依赖外部类的对象的引用才能调用
//            // 非要访问外部类的变量
//            System.out.println(this.out.data2);
//        }
//
//    }


    /**
     * 实例内部类：在类的内部定义类
     * 可以将实例内部类 当做一个实例成员，调用需要创建对象，因此不能定义static
     */
//    class InnerClass{
//        public int data4=4;
//        public int data1=1000;
//        private int data5=5;
//        //public static int data6=6;//在实力内部类中  不能 定义静态变量
//        public static final int data6=6;
//
//        public void funcInner() {
//            System.out.println("实力内部类的方法");
//            System.out.println(data1);//1000
//            System.out.println(this.data1);//1000
//            System.out.println(OuterClass.this.data1);//1  访问的是外部类的 data1
//        }
//
//    }
//}

 class OuterClass {
     public void func() {
         System.out.println("fun()");
     }
 }


public class TestDemo {
     interface A {
         public void fun();
     }
    //匿名的接口
     A a=new A() {
         @Override
         public void fun() {
             System.out.println("创建了一个匿名内部类，实现了A接口(重写了A接口的方法)");
         }
     };


    public static void main(String[] args) {
        int local=88;

        //匿名子类
        new OuterClass(){
            //在匿名内部类中 可以重写 类中的方法
            @Override
            public void func() {
                System.out.println("匿名内部类重写的fun()");
                System.out.println(local);
                //local=99;
            }
        }.func();

    }



//   public static void main(String[] args) {
//        OuterClass outerClass=new OuterClass();
//        OuterClass.InnerClass innerClass=new OuterClass.InnerClass(outerClass);
//        innerClass.funcInner();
//    }

//    public static void main1(String[] args) {
//        //写法一
//        OuterClass outerClass=new OuterClass();
//        OuterClass.InnerClass innerClass= outerClass.new InnerClass();
//
//        //写法二
//        OuterClass.InnerClass innerClass2=new OuterClass().new InnerClass();
//
//        innerClass.funcInner();
//    }



}
